<!DOCTYPE html>
<html lang="en">                                                                                                                                                            
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <script>


        // es6
        // 面试 只能给简单数据类型去重
        // function unique(arr) {
        //     return Array.from(new Set(arr));
        // }
        // console.log(unique([1, 3, 3, 4, 5, 5]));
        

        const arr = [
            {name: ''},                                                                                                                             
            {name: 'dfv'},
            {name: 'dfv'},
            'hello world',
            [1, 2, 3, 5, 4],
            [1, 2, 3, 5, 3],
            [1, 2, [1, 2, 3]],
            [1, 2, [1, 2, 3, 4]],
            {name: [1, 2]},
            {name: [1, 2, 3]},
        ]
        function isEqual(v1, v2) {
                const type1 = v1 instanceof Object;
                const type2 = v2 instanceof Object;
                // 如果类型不相等，直接返回false
                if (type1 !== type2) {
                    return false;
                }
                // 都是基础数据类型
                if (!type1) {
                    return v1 === v2;
                }
                // 都是引用数据类型
                // 一个对象一个数组
                if (v1.constructor !== v2.constructor) {
                    return false;
                }
                // 都是对象或者都是数组
                // 两个键值对数量不一样
                if (Object.values(v1).length !== Object.values(v2).length) {
                    return false;
                }
                for (const k in v1) {
                    // 产生两个值,递归比较
                    if (!isEqual(v1[k], v2[k])) {
                        return false;
                    }
                }
                return true;
            }


        // 面试题  去重
        // function unique (arr) {
        //     const res = [];
        //     for (const item of arr) {
        //         if (!res.some(resItem => isEqual(resItem, item))) {
        //             res.push(item);
        //         }
        //     }
        //     return res;
        // }

        // console.log(unique(arr));


        // 用reduce去重
        const uniqueArr = arr.reduce((prev, current) => {
            return prev.some(prevItem => isEqual(prevItem, current)) 
            ? prev 
            : prev.concat([current]);
            // : [...prev, current];
        },[]);
        console.log(uniqueArr);
    </script>                                                                                                                                                                                                                                                      
</body>
</html>